package main

import (
	"fmt"
	"time"
)

/*
*
  - 创建一个缓冲大小的通道，用于生产者和消费者之间的通信。
    生产者每一秒发送一个消息，消费者每秒处理一个消息。
*/
func main() {
	// 创建一个缓冲大小为10的整型通道，用于生产者和消费者之间的通信。
	messages := make(chan int, 10)

	// 启动一个goroutine作为消费者处理messages通道中的消息。
	go func() {
		// 创建一个定时器，每隔一秒触发一次。
		ticker := time.NewTicker(time.Second)
		defer ticker.Stop() // 确保在goroutine退出时停止定时器

		for _ = range ticker.C {
			// 从messages通道接收消息
			msg, ok := <-messages
			if !ok {
				// 如果通道关闭，退出goroutine。
				fmt.Println("child process interrupt……")
				return
			}
			// 打印接收到的消息
			fmt.Printf("received message: %d\n", msg)
		}
	}()

	// 启动一个goroutine作为生产者向messages通道发送消息。
	go func() {
		// 创建一个定时器，每隔一秒触发一次。
		ticker := time.NewTicker(time.Second)
		defer ticker.Stop() // 确保在goroutine退出时停止定时器

		for i := 0; i < 10; i++ {
			<-ticker.C
			// 向messages通道发送消息
			messages <- i
			fmt.Printf("sent message: %d\n", i)
		}

		// 发送完所有消息后，关闭messages通道，通知消费者goroutine停止等待。
		close(messages)
	}()

	// 主协程休眠15秒，以确保消费者有足够的时间处理所有消息。
	time.Sleep(15 * time.Second)

	// 打印主协程退出的消息。
	fmt.Println("main process exit!")
}
